package com.db.patterns.template;

/**
 * 抽象模板方法模式
 */
public abstract class Client {
    /**
     * 模板方法 加上final确保不会被子类进行重写
     *
     * @return
     */
    public final Double accountMoney(Double money) {
        Double oldPrice = oldPrice(money);
        Double disCount = accountDiscount();
        return disCount * oldPrice;
    }

    /**
     * 基本方法（抽象方法）计算折扣
     * @return
     */
    protected abstract Double accountDiscount();

    /**
     * 基本方法，获取客户类型
     */
    protected abstract String doGetClientType();


    /**
     * 基本方法，已经实现，计算原价
     *
     * @param price
     * @return
     */
    private Double oldPrice(Double price) {
        return price;
    }
}
